home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperLib 1997 Winter - Disc 1
/
HYPERLIB-1997-Winter-CD1.ISO.7z
/
HYPERLIB-1997-Winter-CD1.ISO
/
オンラインウェア
/
COM
/
Saneatsu 1.5 PPC.sit
/
Saneatsu 1.5 PPC
/
實篤・スクリプティングの手引き
< prev
next >
Wrap
Text File
|
1996-11-18
|
14KB
|
447 lines
■ Saneatsu Lite スクリプティングの手引き
Copyright (C) 1996 Takeshi Yoneki / OSTRACISM CO.
OSTRA / Takeshi Yoneki / 米木 武
Nifty-Serve : GCC01675
Sanesatu Lite 1.5 1996.10.21
■ はじめに
實篤のスクリプト化はまだ完成していません。もっと良い実装方法があるとも思いますが、ともかく現状の説明をします。今後改造が入るとスクリプトの互換性が失われる可能性がありますので、その点はご了承下さい。スクリプト化のご意見、ご感想、ご指導をお待ちしています。また、完全にテストしきれていませんのでバグ報告もお願いします。
スクリプト化を実装したことで、實篤は初期のバージョン(1.0、1.1)に比べいくらかメモリを多く消費するようになりました。これは多くのローレベルのオブジェクトで仮想関数を持ってしまったことが原因です。特に影響を与えているのは文字列オブジェクトとリストオブジェクトでしょう。實篤のスクリプト化実装では文字列などのオブジェクトに対しkAEGetDataといったようなイベントを直接渡しています。
スクリプト可能なアプリケーションのAppleScriptスクリプティング機能を使うときに、普通'aete'リソースを元にした「用語説明」を参照しますが、これだけでスクリプトが書けるかというとそれは全くの『嘘』です。クラスとメソッドの一覧を得ることはできますが、どのクラスがどのメソッドを持つかの情報は結局'aete'リソースには入っていないからです。
そこで、實篤のクラスとメソッドを解説します。結果的に實篤のオブジェクトモデル(階層)を説明することになるでしょう。
■ クラス構造
實篤のログは下記のクラス構造でアクセスします
application -*- bbs -*- forum -*- room -*- message
例:
(* "room"クラスを指定するためにbbsから順番に名前で指示しています。
"room"には"message count"というプロパティがあり、それを"get"しています。
*)
tell application "Saneatsu Lite"
tell room "MAIL" of forum "MAIL" of bbs "NIFTY-J"
get message count
end tell
end tell
クラスは通常エレメントとプロパティを含有しています。"room"にとって"message"はエレメントですが、"message count"はプロパティです。クラスの含有するエレメントは全体としてクラスの階層構造を作り、スクリプトでは"of"を使ってそれを表現することになります。親子関係と考えて良いでしょう。
ただ、プロパティもまたクラスです。更に下層構造を持つプロパティも考えられますが、多くはそのレベルが最下層となるようです。もちろん"of"で関係を表現します。
エレメントとプロパティの違いはなかなか面倒くさいものですが、ある部分をエレメントとするかプロパティとするかはスクリプト可能なアプリケーションの『設計者』が悩むことであり、スクリプトを書く側の気にすることではありません。
AppleScriptの基本的なメソッドに"get"と"set"があります。プロパティはほぼ確実に"get"の対象になりますが、エレメントが"get"の対象になるかどうかはまちまちです。プロパティはデータとして意義のあるものが"get"できなすが、エレメントを"get"したときに得られるものは通常「オブジェクトスペシファイア」という、オブジェクトを特定するためのスクリプト内部で意味を持つ「表現」そのものです。
"room"のプロパティの"message count"は整数が"get"できますが、エレメントである"message"を"get"したときにはその"message"を示す表現が得られます。例外もあり、"line"は"window"のエレメントですが、"get"すると内容である文字列が得られます。
逆にプロパティは"get"と"set"以外のメソッドは持たないようです。エレメントは独特なメソッドを持ちます。"message"は"bookmark"できますが、"message count"を"bookmark"するというのは意味を持ちません。また、エレメントは"tell"の対象になります。
"message"は構造を規定する論理的な存在でしかなく、結局は「その発言を下さい」とは書けず、「その発言のタイトルを下さい」とか「その発言のハンドルを下さい」となるわけです。"title"や"handle"は"message"のプロパティです。
"set"は"get"の裏返しです。"get"できないものに"set"は通常できません。'aete'の記述でもread only/read writeの二つの特性があるのみで、write onlyという特性はありません。readが"get"で、writeが"set"です。
「オブジェクトスペシファイア」を返すものに"set"することは意味を持ちません。
"get"はスクリプトで"get"と書く以外でも、例えば"copy"でもアプリケーションに伝わります。
例:
(* "room"クラスを指定するためにbbsから順番に名前で指示しています。
"message"クラスを順序数で指定しています。
"message"には"title"というプロパティがあり、それに"set"しています。
*)
tell application "Saneatsu Lite"
tell room "MAIL" of forum "MAIL" of bbs "NIFTY-J"
set title of message 1 to "メール1番"
end tell
end tell
例:
(* "application"クラスのプロパティである"log folder"を
file "USER:Term:Log:"にします。
ファイルを即値で指定するときは絶対パスでなくてはいけないようです。
ディレクトリを指定するときもキーワード"file"は変わりません。
*)
tell application "Saneatsu Lite"
set log folder to file "USER:Term:Log:"
end tell
實篤のスクリプト化でログに関してやりたいことは、特定条件での情報の収集と加工に他ならず、ともかく変に實篤の持つユーザインタフェースにとらわれてはいけないであろうと考えました。可能な限り単純なクラス構造を提供し、その全てのデータにアクセスできるようにスクリプト化しました。
ログには論理的な構造と物理的な実体があります。"room"は論理的に"forum"に含まれますが、実際には1つのファイルです。そこで、"room"には"log file"というプロパティがあり、対応するファイルの情報を得ることができます。
ウィンドウクラスはエディタとしての機能がかなり少ないと思いますが、「加工したテキストの保存場所」という程度の意味で実装しました。また、ウィンドウクラスが一般的に持つべきプロパティもほとんどありません。一応"line"でテキストをエディットできる格好にしてあります。
bbs、forum、room、messageは「some bbs」のように「some」を使って指定した場合に「カレント」を返すようにしました。これには異論があろうとは思いますが、カレントを指定する良い方法が思い当たらなかったためです。一応プロパティにカレントを用意しましたが、使い勝手は良くないようです。
■ リファレンス
"application"
アプリケーションクラス
エレメント
bbs
BBS
window
ウィンドウ
プロパティ
name [r/ ] (文字列)
アプリケーションの名前
log folder [r/w] (ファイルスペック)
ログフォルダ
変更はpreferencesには残らない一時的なもの
変更したらtheLogをデストラクトして新たにコンストラクトする
post folder [r/w] (ファイルスペック)
ポストフォルダ
変更はpreferencesには残らない一時的なもの
単純変更
bookmarker folder [r/w] (ファイルスペック)
栞フォルダ
変更はpreferencesには残らない一時的なもの
単純変更
bbs count [r/ ] (整数)
BBSの数
current bbs [r/ ] (オブジェクトスペシファイア)
カレントのBBS
メソッド
make window
エディタ"window"を新規作成する
"bbs"
BBSクラス
エレメント
forum
フォーラム
プロパティ
name [r/ ] (文字列)
BBS名
order number [r/ ] (整数)
順序数
log folder [r/ ] (ファイルスペック)
BBSのログフォルダ
bookmarker folder [r/ ] (ファイルスペック)
BBSの栞フォルダ
forum count [r/ ] (整数)
フォーラムの数
current forum [r/ ] (オブジェクトスペシファイア)
カレントのフォーラム
メソッド
get
"bbs"のオブジェクトスペシファイアを返す
"forum"
フォーラムクラス
エレメント
room
会議室
プロパティ
name [r/ ] (文字列)
フォーラム名
order number [r/ ] (整数)
順序数
room count [r/ ] (整数)
会議室数(会議室ファイルの数)
current room [r/ ] (オブジェクトスペシファイア)
カレントの会議室
メソッド
get
"forum"のオブジェクトスペシファイアを返す
"room"
会議室クラス
エレメント
message
発言(メール)
プロパティ
name [r/ ] (文字列)
会議室の名前(ファイル名)
order number [r/ ] (整数)
順序数
title [r/w] (文字列)
会議室タイトル
リソースに反映
room number [r/ ] (整数)
会議室番号
section [r/ ] (整数)
セクション番号
message count [r/ ] (整数)
発言(メール)の数
log file [r/ ] (ファイルスペック)
ログファイル
max count [r/ ] (整数)
最大発言数
day limit [r/w] (整数)
削除するための経過日数
リソースに反映
delele_day_flag [r/w] (論理値)
既読の発言は経過時間により削除する
リソースに反映
delete_unread_flag [r/w] (論理値)
未読の発言も経過時間により削除する
リソースに反映
delete_all_read_flag [r/w] (論理値)
既読の発言は全て削除する
リソースに反映
unread count [r/ ] (整数)
未読発言(メール)の数
current message [r/ ] (オブジェクトスペシファイア)
カレントのメッセージ
メソッド
get
"room"のオブジェクトスペシファイアを返す
"message"
発言(メール)クラス
プロパティ
name [r/w] (文字列)
発言タイトル
リソースに反映
title [r/w] (文字列)
nameと同じ
発言タイトル
リソースに反映
id [r/w] (文字列)
ID
リソースに反映
handle [r/w] (文字列)
ハンドル
リソースに反映
message number [r/w] (整数)
発言番号
リソースに反映
response number [r/w] (整数)
発言リンク先の番号
リソースに反映
order number [r/ ] (整数)
リストに表示されてるソート後の順序数
index number [r/ ] (整数)
インデックス番号(1〜n)
リソース上の順序数(ファイル上の順番)
length [r/ ] (整数)
本文サイズ
file position [r/w] (整数)
会議室ファイル上の位置
リソースに反映
read_mark [r/w] (論理値)
既読マーク(trueでON)
リソースに反映
protect_mark [r/w] (論理値)
保護マーク(trueでON)
リソースに反映
delete_mark [r/w] (論理値)
削除マーク(trueでON)
リソースに反映
selected [r/w] (論理値)
発言タイトル一覧の選択状態(trueでON)
date [r/w] (文字列)
日付
"1996/7/30"という書式
リソースに反映
time [r/w] (文字列)
時刻
"01:25:00"という書式
リソースに反映
contents [r/ ] (文字列)
テキスト全体
メソッド
select
発言の選択
選択された発言以外の選択は解除される
複数選択には"selected"プロパティを使う
bookmark
栞をはさむ
get
"message"のオブジェクトスペシファイアを返す
"window"
ウィンドウクラス
エレメント
line
テキストの行
何行目かで指定する
プロパティ
name [r/w] (文字列)
ウィンドウの名前
メインのビューウィンドウは"ブラウズウィンドウ"で、これだけは変更できない
line count [r/ ] (整数)
テキストの行数
modified [r/ ] (論理値)
モディファイされているかどうか(trueでモディファイされている)
"ブラウズウィンドウ"には意味がない
contents [r/w] (文字列)
テキスト全体
posted [r/w] (論理値)
保存時に"/POST"を付加するかどうか(trueで付加する)
"ブラウズウィンドウ"には意味がない
メソッド
add
[data]
[file]
テキストの付加
insert
[data]
[file]
テキストの挿入
add line
[data]
行の付加(テキストの付加に改行を加えたもの)
insert line (make line)
[on]
[data]
行の挿入
キャレット位置が保持されません
get
"window"のオブジェクトスペシファイアを返す
save
[as file]
[at folder]
テキストのファイル保存
"ブラウズウィンドウ"の場合は"message"で"selected"されている発言を保存
select
windowを最前面にする
close
windowを閉じる
"line"
テキストの行クラス
メソッド
get
行のテキストを得る
改行は省かれる
set
行のテキストを入れ替える
改行は自動的に入る
delete
行の削除
■ サンプル
1.このハンドルの発言を選択
tell application "Saneatsu Lite"
copy current bbs to theBBS
copy current forum of theBBS to theForum
copy current room of theForum to theRoom
copy current message of theRoom to theMessage
-- カレントのメッセージを得るためにこう書いていますが現状では
-- tell some message of some room of some forum of some bbs
-- とも書けます
tell theMessage
copy handle to theHandle
end tell
-- プロパティの値は一度代入してから使う方が確実のようです
tell theRoom
copy message count to theCount
repeat with n from 1 to theCount
tell message n
if theHandle is handle then
set selected to true
else
set selected to false
end if
end tell
end repeat
end tell
activate
end tell
2.シグニチャ挿入
tell application "Saneatsu Lite"
activate
copy scripts folder as string to theFolder
-- スクリプトフォルダを文字列として得ることで加工を容易にしています
copy name of front window to theWinName
if theWinName is "ブラウズウィンドウ" then
beep
else
tell front window
insert data ((current date) as string) & return
insert file (theFolder & "Signature")
-- 現在日時と"Signature"ファイルの内容を現在のキャレット位置に挿入します
end tell
end if
end tell
3.タイトル一覧
tell application "Saneatsu Lite"
activate
make window
copy result to theWindow
set name of theWindow to "タイトル一覧"
copy current bbs to theBBS
copy current forum of theBBS to theForum
copy current room of theForum to theRoom
tell theRoom
copy message count to theCount
repeat with n from 1 to theCount
-- メッセージは見えている順番に1〜nです
copy title of message n to theTitle
-- プロパティの値は一度代入してから使う方が確実のようです
tell theWindow
add line data theTitle
end tell
end repeat
end tell
end tell
4.ポストを開く
tell application "Saneatsu Lite"
copy post folder to theFolder
-- プロパティの値は一度代入してから使う方が確実のようです
end tell
-- 實篤以外のアプリのスクリプトを書いても問題ありません
tell application "Finder"
select theFolder
open selection
end tell
5.本文の引用
tell application "Saneatsu Lite"
activate
copy front window to theSayWin
copy window "ブラウズウィンドウ" to theLogWin
-- いったんブラウズウィンドウをtheLogWinに、エディタウィンドウをtheSayWinに
-- 代入していますが、ウィンドウの位置関係が変化すると無効になります
if theSayWin is theLogWin then
beep
else
copy line count of theLogWin to theLoop
repeat with n from 1 to theLoop
copy line n of theLogWin to theLine
tell theSayWin
insert data ("> " & theLine & return)
-- 引用符付きで現在のキャレット位置に挿入します
end tell
end repeat
end if
end tell
6.経過時間による削除OFF
-- 現在のフォーラムの全会議室ファイルの経過時間による削除フラグをOFFにします。
tell application "Saneatsu Lite"
activate
copy current bbs to theBBS
copy current forum of theBBS to theForum
tell theForum
copy room count to theRoomCount
repeat with n from 1 to theRoomCount
tell room n
set delele_day_flag to false
-- 経過時間による削除フラグをOFFにするとリソースに反映されます
end tell
end repeat
end tell
end tell